package com.example.learningnote.basic;

public class Student extends Person{
    private String courseName;
    // 类加载时（在创建对象之前） 初始化顺序：
    // 先初始化父类的静态部分（静态字段和静态块）。
    // 再初始化子类的静态部分。
    // 对象创建时：
    // 执行 super 关键字，初始化父类的实例部分（实例字段和构造函数）。
    // 最后初始化子类的实例部分（实例字段和构造函数剩余逻辑）。
    // 父类静态 → 子类静态 → 父类实例（super）→ 子类实例。
    Student(String name, int age, String sex , String courseName) {
        super(name, age, sex); // super 必须在第一条
        // 除了调用构造函数，super 还可以访问父类的字段或方法
        // super 的核心作用是建立子类与父类之间的联系，确保父类的初始化逻辑（通过构造函数）或成员（字段/方法）在子类中可用。
        this.courseName = courseName;
    }

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public String show(){
        return this.getName()+"在唱歌"+this.dance();
    }

    // 重写了父类的 eat方法   @Override 继承并重写的标志
    // dance 在父类中被 final 修饰，在子类不能重写
    // 子类重写的方法必须与父类方法有相同的名称和参数列表（包括参数个数、类型和顺序）
    // 返回值类型可以是父类方法返回类型的子类型（协变返回类型，Covariant Return Type），但不能完全不同。
    @Override
    public String eat(){
        return "学生" + super.getName()+ "在" + this.courseName + "课上吃零食";
    }

    /**
     * 重写的父类方法
     */
    @Override
    public void speak() {

    }

}
